package com.qfedu.edu.job;

import com.qfedu.edu.constance.RabbitMQConstance;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * @author xiaobobo
 * @title: MonitorQueueMessageCountJob
 * @projectName cd-fy-2401-third-project-parent
 * @description: 这个类的主要作用是监控队列中消息的个数
 * @date 2024/10/10  16:17
 */
@Component
@Slf4j
public class MonitorQueueMessageCountJob {

    @Autowired
    private Channel channel;

    /**
     * 每隔5分钟监控一次这个消息的个数
     */
    @Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES)
    public void monitor() throws IOException {
        //首先获取所有队列名字的数组
        String[] queueNamesArray = RabbitMQConstance.getQueueNamesArray();
        for (int i = 0; i <queueNamesArray.length ; i++) {
            //找到队列的名字
            String queueName = queueNamesArray[i];
            //通过通道 去获取 当前队列中消息的个数 以及消费者的数量
            AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive(queueName);
            //获取队列中消息的个数
            int messageCount = declareOk.getMessageCount();
            //获取对象当前的消费者的数量
            int consumerCount = declareOk.getConsumerCount();
            if(messageCount>=RabbitMQConstance.getQueueMessageLimit()){
                //说明队列中消息的积压个数  已经达到了指定阈值以上
                //那么这里就要通知运维...
                //TODO 系统需要预警的
                log.error("队列{}消息的个数{}已经达到了指定的阈值、请做好预防",queueName,messageCount);
            }
            if(consumerCount==0){
                //说明消费者的服务死了 那么需要预警运维去进行消费者服务的重启
                log.error("队列:{}没有消费者了，请检查系统是否还正常运行",queueName);
            }

        }

    }

}
